package com.filipinas.tresenraya;

import java.util.Random;

import android.util.Log;

public class ControladorJuego {
	
	public static enum TIPO_JUEGO {JUGADOR1,JUGADOR2};
	private int [][]tablero; 
	private boolean turno;
	private int cuentaCasillas;
	private int xOrd;
	private int yOrd;
	private TIPO_JUEGO modoJuego;
	
	public ControladorJuego(){
		tablero = new int[][]{{0,0,0},{0,0,0},{0,0,0}}; 
		turno = true;
		cuentaCasillas = 0;
		xOrd = 9;
		yOrd = 9;
	}

	public ControladorJuego(TIPO_JUEGO modo)
	{
		tablero = new int[][]{{0,0,0},{0,0,0},{0,0,0}}; 
		turno = true;
		cuentaCasillas = 0;
		xOrd = 9;
		yOrd = 9;
		modoJuego = modo;
	}
//	Si aun no se han usado las nueve casillas juega segun turno	
	public int ejecutarJugada(int x, int y){

		if(cuentaCasillas < 9){
			if(turno){
				tablero[x][y] = 1;
				cuentaCasillas++;
				cambioTurno();
			}
			else if(!turno && this.modoJuego == TIPO_JUEGO.JUGADOR2){
				tablero[x][y] = -1;
				cuentaCasillas++;
				cambioTurno();
			}
		}else {
//			Log.i("ejecutarJugada", "XX: entro en el primer else");
			return cuentaCasillas;
		}
		int ganador = comprobarFin();		
		if(ganador == 0 || ganador == 1) {
			return ganador;
		}	
		else{
			Log.i("ejecutarJugada", "XX: entro en el segundo else casillas:" + this.cuentaCasillas);			
			return -1;
		}			
	}
	
//	Recorre la matriz y devuelve 0 o 1 si a ganado algun jugador, o -1 si no hay ganador	
	public int comprobarFin()
	{
		
		int diagonal1 = 0;
		int diagonal2 = 0;		
		for (int x = 0; x < 3; x++){
			int cont1 = 0;
			int cont2 = 0;
            for (int y = 0; y < 3; y++){
                cont1 += tablero[x][y];
                cont2 += tablero[y][x];
                if (x == y){
                	diagonal1 += tablero[x][y];
                }
                if ((x+y) == 2 ){
                	diagonal2 += tablero[x][y];
                }
            }
            if(cont1 == 3 || cont2 == 3){
            	return 0;
            }else if(cont1 == -3 || cont2 == -3){
            	return 1;
            }
		}
		if(diagonal1 == 3 || diagonal2 == 3){
			return 0;
		}else if(diagonal1 == -3 || diagonal2 == -3){
			return 1;
		}else{
			return -1;	
		}
	}
	
//	Devuelve x,y y numero de casillas
	public int[] jugadaOrdenador(){
		Random r = new Random();
		boolean jugado = false;
		int jugada = -1;
		while(!jugado && !(comprobarFin()>0))
		{	
			xOrd =(int)r.nextInt(3);
			yOrd =(int)r.nextInt(3);
			Log.i("TT","XX: random " + xOrd + "-" + yOrd);
			if(tablero[xOrd][yOrd] == 0)
			{
				tablero[xOrd][yOrd] = -1;
				cuentaCasillas++;
				jugada = comprobarFin();
				if(this.cuentaCasillas == 9)
					jugada = 9;
				setTurno(true);
				jugado = true;
			}
		}
		if(jugado){
			return new int[]{xOrd,yOrd,jugada};
		}else{
			return new int[]{0,0,9};
		}
	}
	
//	Cambia el turno
	public void cambioTurno(){
		turno = !turno;
	}
	
	public void unNuevoJuego(){
		if(!(cuentaCasillas < 9)){
		tablero = null; 
		turno = true;
		cuentaCasillas = 0;
		xOrd = 0;
		yOrd = 0;
		modoJuego = null;
		}
	}
	
	public TIPO_JUEGO getModo(){
		return modoJuego;
	}
	
	public boolean isTurno() {
		return turno;
	}

	public void setTurno(boolean turno) {
		this.turno = turno;
	}
}
